package com.cskaoyan.javase.object._6clone._0introduction;

/**
 * 空接口的作用
 * 和instanceof相关
 * 由于instanceof可以用来判断子类对象,所以可以在空接口中,判断某个对象是否是空接口的子类对象
 * 某个类实现了空接口,虽然没有获取任何成员,但是间接了改变了数据类型
 *      --> 从原先不是这个接口的子类(和接口没关系)
 *      变成了接口的子类
 *
 * 根据这个特点,配合instanceof,可以对对象做不同的操作
 * 所以这种空接口,虽然没有抽象方法,不能表示规范和标准,但是它起到标记的作用,配合instanceof就可以实现
 *      实现标记接口,允许做一些操作
 *      不实现标记接口,禁止做一些操作,抛出异常
 *
 * @since 16:28
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) throws CloneNotSupportedException {
        B a = new B();
        judgeImplEmptyInterface(a);
    }

    // 下列方法用于判断某个对象,是否实现接口EmptyInterface
    public static void judgeImplEmptyInterface(Object o) throws CloneNotSupportedException {
        if (o instanceof EmptyInterface) {
            // 说明o引用指向的对象,必然是EmptyInterface接口的子类对象,该类实现了空接口
            System.out.println("实现了空接口,允许做克隆操作,不抛出异常");
            return;
        }
        // 说明o引用指向的对象,不是接口EmptyInterface的子类对象,该类没有实现空接口
        throw new CloneNotSupportedException("没有实现空接口,禁止克隆!");
    }
}

class B implements EmptyInterface {
}

interface EmptyInterface {

}
